﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Entidades
{

    /*
     * As principais configurações a serem variadas são Elite (), mutante (), dado (), se perturba ou nao () e os vizinhos.
     * 
     * 
     */ 
    public class Configuration2
    {
        //Configurações da execução
        private int population;
        private int qtdeGeracoes;
        private int id;
        private double seed;


        private bool paradaFixa;
        private bool paradaDinamica;

        public bool ParadaFixa
        {
            get { return paradaFixa; }
            set 
            {
                if (value == true && paradaDinamica == true)
                    throw new Exception("Parada por default não pode ser ativada pois a parada por Máximo já foi ativada");

                paradaFixa = value; 
            }
        }


        public bool ParadaDinamica
        {
            get { return paradaDinamica; }
            set 
            {
                if (value == true && paradaDinamica == true)
                    throw new Exception("Parada por Máximo não pode ser ativada pois a parada por Default já foi ativada");


                paradaDinamica = value; 
            }
        }

        //Na parada fixa, se depois de 'exitExecucoesSemMelhoria' gerações não ocorrer melhora no MQ, a execução é abortada.
        private int exitExecucoesSemMelhoria = 4000;

        //Na parada dinâmica, após 3000 gerações, se após 'execucoesPosDefault' nao ocorrer melhora do MQ a execução é abortada.
        private int execucoesDinamica = 1000;
        private int execucoesPosDinamica = 500;


        public int ExecucoesPosDefault
        {
            get { return execucoesPosDinamica; }
            set { execucoesPosDinamica = value; }
        }



        public int ExecucoesDinamica
        {
            get { return execucoesDinamica; }
            set { execucoesDinamica = value; }
        }

      

        public int ExitExecucoesSemMelhoria
        {
            get { return exitExecucoesSemMelhoria; }
            set { exitExecucoesSemMelhoria = value; }
        }


        private string estrategiaDecodificacao;

        public string EstrategiaDecodificacao
        {
            get { return estrategiaDecodificacao; }
            set { estrategiaDecodificacao = value; }
        }

    
        //Configurações do BRKGA
        private double eliteProb;
        private double mutantProb;
        private double populationElite;
        private double populationMutant;
        private double populationInheritanceProbability;
        private int combinado;
    
        //Configurações do decoder
        private double porc_Vizinhos;
        private bool avaliarResetPopulacao;
        private bool avaliarReconfigPopulacao;
        private  int numVizinhos;
        private double minClusters;
        private double maxClusters;
        private double limiteBuscaDosNos;

        public double LimiteBuscaDosNos
        {
            get { return limiteBuscaDosNos; }
            set { limiteBuscaDosNos = value; }
        }

        public double Seed
        {
            get { return seed; }
            set { seed = value; }
        }

        public int Combinado
        {
            get { return combinado; }
            set { combinado = value; }
        }

        public double PopulationInheritanceProbability
        {
            get { return populationInheritanceProbability; }
            set { populationInheritanceProbability = value; }
        }

        public int QtdeGeracoes
        {
            get { return qtdeGeracoes; }
            set { qtdeGeracoes = value; }
        }


        public double MinClusters
        {
            get { return minClusters; }
            set { minClusters = value; }
        }

        
        public double MaxClusters
        {
            get { return maxClusters; }
            set { maxClusters = value; }
        }
        private double limiteBuscaNos;

      

        public bool AvaliarReconfigPopulacao
        {
            get { return avaliarReconfigPopulacao; }
            set { avaliarReconfigPopulacao = value; }
        }

        public bool AvaliarResetPopulacao
        {
            get { return avaliarResetPopulacao; }
            set { avaliarResetPopulacao = value; }
        }


        public double Porc_Vizinhos
        {
            get { return porc_Vizinhos; }
            set { porc_Vizinhos = value; }
        }


        public int Population
        {
            get { return population; }
            set 
            {
 
                population = value;

                if (this.eliteProb == 0 || this.mutantProb == 0)
                    throw new NullReferenceException("Vc deve configurar as probabilidades primeiro");

                this.populationElite = Math.Round(this.population * this.eliteProb);
                this.populationMutant = Math.Round(this.population * this.mutantProb);
            }
        }

        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        public double PopulationMutant
        {
            get { return populationMutant; }
            set { populationMutant = value; }
        }

        public double PopulationElite
        {
            get { return populationElite; }
            set { populationElite = value; }
        }

        public double MutantProb
        {
            get { return mutantProb; }
            set { mutantProb = value; }
        }

        public double EliteProb
        {
            get { return eliteProb; }
            set { eliteProb = value; }
        }

        public override string ToString()
        {
            return ("Elite:" + this.eliteProb + " Mutante:" + this.mutantProb + " Vicio: " + this.populationInheritanceProbability + 
                " MinClusters:" + this.minClusters + " MaxClusters:" + this.maxClusters + " Combinado:" + this.combinado + " Populacao:" 
                + this.population + " Geracoes:"+this.qtdeGeracoes +" NumVizinhos:"+ this.porc_Vizinhos+ "EstrategiaDecodificacao:" +  this.EstrategiaDecodificacao + "\n");
        }
    }
}
